/**
 * 
 */
package com.lifeware.research.endo.controllers;

import java.util.Date;
import java.util.Map;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;

import com.lifeware.research.endo.controllers.utils.ControllersUtils;
import com.lifeware.research.endo.models.SchedaBaseSummary;
import com.lifeware.research.endo.models.entities.AcromegaliaSchedeBase;
import com.lifeware.research.endo.models.entities.EsamiStrumentali;
import com.lifeware.research.endo.services.AcromegaliaService;
import com.lifeware.research.endo.views.AcromegaliaSchedaBase;
import com.lifeware.research.endo.views.AcromegaliaSchedaFollowUp;
import com.lifeware.research.endo.views.PazienteProxy;
import com.lifeware.research.endo.views.contexts.InsertSchedaBaseAcromegaliaContext;

/**
 * <p>Controllore per le azioni possibili sulla malattia Acromegalia.
 * </p> 
 *
 * @author  Riccardo Cardin, (C) 2012 Lifeware
 * @version 1.0
 */
@Controller
@SessionAttributes("{paziente, tipiColonscopia, tipiTiroide}")
public class AcromegaliaController extends AbsMalattieController {
	
	/* Risorse */
	private static final String VIEW_PATH = 
			"/paziente/acromegaliaSchedaBase/dettaglio";
	private static final String EDIT_PATH = 
			"/paziente/acromegaliaSchedaBase/modifica";
	private static final String INSERT_PATH = 
			"/paziente/acromegaliaSchedaBase/init";
	private static final String INSERT_SFU_PATH = 
			"/paziente/acromegaliaSchedaFollowup/init";
	
	private static final String REDIRECT = "redirect:";
	
	public static final String ACROMEGALIA_SCHEDA_BASE = "acromegaliaSchedaBase";
	public static final String ACROMEGALIA_DESCRIZIONE = "Acromegalia";
	
	@Autowired
	private AcromegaliaService acromegaliaService;

	@RequestMapping(value="/paziente/acromegaliaSchedaBase/crea", method=RequestMethod.POST)
	public String instradaMalattia(AcromegaliaSchedaBase acromegaliaSchedaBase, Model model, HttpSession session) {
		
		/* Recupero il contesto */
		InsertSchedaBaseAcromegaliaContext context = 
				(InsertSchedaBaseAcromegaliaContext) session.getAttribute("context");
		
		/* Rimuovo il contesto dalla sessione */
		session.removeAttribute("context");
		
		/* 
		 * Recupero l'identificativo della malattia dalla sessione: nel caso 
		 * della modifica l'identificativo sara' valorizzato; nel caso 
		 * dell'inserimento no.
		 */
		Integer idMalattia = (Integer) session.getAttribute("idMalattia");
		
		/* Costruisco l'oggetto da salvare all'interno del database */
		AcromegaliaSchedeBase acromegaliaSchedeBase = 
				this.acromegaliaService.map(acromegaliaSchedaBase,
						idMalattia,   // puo' essere null
						context.getMappaEsamiStrumentaliColonscopia(), 
						context.getMappaEsamiStrumentaliTiroide());
		
		/* Aggiugo al contesto l'oggetto creato per la malattia */
		context.setAcromegaliaSchedaBase(acromegaliaSchedeBase);
		
		/* Aggiungo il contesto alla sessione */
		session.setAttribute("context", context);
		
		PazienteProxy paziente = (PazienteProxy) session.getAttribute("paziente");
		paziente.setAcromegaliaSB(acromegaliaSchedeBase);
		
//		session.setAttribute("paziente", paziente);
		
		return "redirect:" + this.getRedirectResourceInsertPaziente();
	}
	
	@RequestMapping(value="/paziente/acromegaliaSchedaBase/confermaMod", method=RequestMethod.POST)
	public String modificaMalattia(AcromegaliaSchedaBase acromegaliaSchedaBase, Model model, HttpSession session) {
		
		/* Recupero il contesto */
		InsertSchedaBaseAcromegaliaContext context = 
				(InsertSchedaBaseAcromegaliaContext) session.getAttribute("context");
		
		/* Rimuovo il contesto dalla sessione */
		session.removeAttribute("context");
		
		/* 
		 * Recupero l'identificativo della malattia dalla sessione: nel caso 
		 * della modifica l'identificativo sara' valorizzato; nel caso 
		 * dell'inserimento no.
		 */
		Integer idMalattia = (Integer) session.getAttribute("idMalattia");
		
		/* Costruisco l'oggetto da salvare all'interno del database */
		AcromegaliaSchedeBase acromegaliaSchedeBase = 
				this.acromegaliaService.map(acromegaliaSchedaBase,
						idMalattia,   // puo' essere null
						context.getMappaEsamiStrumentaliColonscopia(), 
						context.getMappaEsamiStrumentaliTiroide());
		
		/* Aggiorno le informazioni */
		this.acromegaliaService.inserisci(acromegaliaSchedeBase);
				
//		session.setAttribute("paziente", paziente);
		
		return this.visualizzaDettaglioPaziente(model, session);
	}
	
	public AcromegaliaService getAcromegaliaService() {
		return acromegaliaService;
	}

	public void setAcromegaliaService(AcromegaliaService acromegaliaService) {
		this.acromegaliaService = acromegaliaService;
	}

	@RequestMapping(value="/paziente/acromegaliaSchedaBase/init")
	public String inizializzaSchedaBase(Model model, HttpSession session) {
		
		/* Creo il contesto */
		InsertSchedaBaseAcromegaliaContext context = new InsertSchedaBaseAcromegaliaContext();
		
		/* Informazioni sul paziente */
//		context.setPaziente(paziente);
//		context.setGhiandola(paziente.getGhiandola());
		context.setMalattia(ACROMEGALIA_SCHEDA_BASE);
		
		Map<String, EsamiStrumentali> tipiTiroide = 
				this.malattieService.getTipoEsamiEcografiaTiroide();
		tipiTiroide.put(AcromegaliaSchedaBase.NESSUN_VALORE, null);
		
		Map<String, EsamiStrumentali> tipiColonscopia = 
				this.malattieService.getTipoEsamiColonscopia();
		tipiColonscopia.put(AcromegaliaSchedaBase.NESSUN_VALORE, null);
		
		context.setMappaEsamiStrumentaliColonscopia(tipiColonscopia);
		context.setMappaEsamiStrumentaliTiroide(tipiTiroide);
		
		/* Inserisco il contesto nella sessione */
		session.setAttribute("context", context);
		
		// FIXME Da portare nella classe astratta
		/* Informazioni sulle schede base in genere */
		
		/* Recupero la lista degli esami immuno-isto-chimici */
		model.addAttribute("immunoistochimiche", this.malattieService.getImmunoIstochimica());
		
		/* Recupero la lista di terapie */
		model.addAttribute("terapieMediche", this.malattieService.getTerapieMediche());
		
		/* Informazioni sull'acromegalia */
		model.addAttribute("tipiTiroide", tipiTiroide);
		model.addAttribute("tipiColonscopia", tipiColonscopia);
		
		/* Recupero la lista di patologie */
		model.addAttribute("patologie", this.malattieService.getPatologie());
		
		AcromegaliaSchedaBase acroSBView = new AcromegaliaSchedaBase();
		acroSBView.setTipoColonscopia(AcromegaliaSchedaBase.NESSUN_VALORE);
		acroSBView.setTipoTiroide(AcromegaliaSchedaBase.NESSUN_VALORE);
		model.addAttribute("acromegaliaSchedaBase", acroSBView);

		
		/* Aggiungo il contesto al modello */
//		model.addAttribute("context", context);
		
//		tipiTiroide = (HashMap<String, EsamiStrumentali>) this.malattieService.getTipoEsamiEcografiaTiroide();
//		tipiColonscopia = (HashMap<String, EsamiStrumentali>) this.malattieService.getTipoEsamiColonscopia();
//		model.addAttribute("tipiTiroide", this.malattieService.getTipoEsamiEcografiaTiroide());
//		model.addAttribute("tipiColonscopia", this.malattieService.getTipoEsamiColonscopia());
		
		return ACROMEGALIA_SCHEDA_BASE;
	}
	
	@RequestMapping(value="/paziente/acromegaliaSchedaBase/dettaglio")
	public String inizializzaSchedaBaseVis(Model model, HttpSession session) {
		
		/* 
		 * Recupero dal modello le informazioni per il recupero del dettaglio 
		 * della malattia.
		 */
		SchedaBaseSummary schedaBaseSum = 
				(SchedaBaseSummary) session.getAttribute("malattiaPaziente");
		session.removeAttribute("malattiaPaziente");
		
		/* Inserisco il nome del paziente nella sessione */
		
		
		/* Recupero le informazioni della scheda base */
		AcromegaliaSchedaBase acroSBView = 
				this.acromegaliaService.getSchedaBase(
						schedaBaseSum.getIdMalattia());
		
		/* Inserisco la scheda base nel modello */
		model.addAttribute("acromegaliaSchedaBase", acroSBView);
		
		return "dettaglioAcromegaliaSchedaBase";
	}
	
	@RequestMapping(value="/paziente/acromegaliaSchedaBase/modifica")
	public String modificaSchedaBase(Model model, HttpSession session) {
		
		/* 
		 * Recupero dal modello le informazioni per il recupero del dettaglio 
		 * della malattia.
		 */
		SchedaBaseSummary schedaBaseSum = 
				(SchedaBaseSummary) session.getAttribute("malattiaPaziente");
		session.removeAttribute("malattiaPaziente");
		
		/* Inserisco in sessione l'identificativo della malattia */
		session.setAttribute("idMalattia", schedaBaseSum.getIdMalattia());
		
		/* Recupero le informazioni della scheda base */
		AcromegaliaSchedaBase acroSBView = 
				this.acromegaliaService.getSchedaBase(
						schedaBaseSum.getIdMalattia());
		
		/* Inserisco la scheda base nel modello */
		model.addAttribute("acromegaliaSchedaBase", acroSBView);
		
		Map<String, EsamiStrumentali> tipiTiroide = 
				this.malattieService.getTipoEsamiEcografiaTiroide();
		tipiTiroide.put(AcromegaliaSchedaBase.NESSUN_VALORE, null);
		
		Map<String, EsamiStrumentali> tipiColonscopia = 
				this.malattieService.getTipoEsamiColonscopia();
		tipiColonscopia.put(AcromegaliaSchedaBase.NESSUN_VALORE, null);
		
		/* Recupero la lista degli esami immuno-isto-chimici */
		model.addAttribute("immunoistochimiche", this.malattieService.getImmunoIstochimica());
		
		/* Recupero la lista di terapie */
		model.addAttribute("terapieMediche", this.malattieService.getTerapieMediche());
		
		/* Informazioni sull'acromegalia */
		model.addAttribute("tipiTiroide", tipiTiroide);
		model.addAttribute("tipiColonscopia", tipiColonscopia);
		
		/* Recupero la lista di patologie */
		model.addAttribute("patologie", this.malattieService.getPatologie());
		
		/* Creo il contesto */
		InsertSchedaBaseAcromegaliaContext context = new InsertSchedaBaseAcromegaliaContext();
		
		context.setMappaEsamiStrumentaliColonscopia(tipiColonscopia);
		context.setMappaEsamiStrumentaliTiroide(tipiTiroide);
		
		/* Inserisco il contesto nella sessione */
		session.setAttribute("context", context);
		
		return "modificaAcromegaliaSchedaBase";
	}
	
	// ------------ SCHEDA FOLLOW-UP --------------
	
	@RequestMapping(value="/paziente/acromegaliaSchedaFollowup/init")
	public String inizializzaSchedaFollowUp(Model model, HttpSession session) {
	
		/* Inserisco la scheda base nel modello */
		model.addAttribute("acromegaliaFollowup", new AcromegaliaSchedaFollowUp());
		
		/* Inserisco la data di creazione */
		model.addAttribute("dataCreazione", 
				ControllersUtils.YYYYMMDD_DATE_FORMAT.format(new Date()));
		
		/* Recupero la lista di terapie */
		model.addAttribute("terapieMediche", this.malattieService.getTerapieMediche());
		
		/* Recupero la lista di patologie */
		model.addAttribute("patologie", this.malattieService.getPatologie());
		
		/* Esami strumentali */
		Map<String, EsamiStrumentali> tipiTiroide = 
				this.malattieService.getTipoEsamiEcografiaTiroide();
		tipiTiroide.put(AcromegaliaSchedaBase.NESSUN_VALORE, null);
		Map<String, EsamiStrumentali> tipiColonscopia = 
				this.malattieService.getTipoEsamiColonscopia();
		tipiColonscopia.put(AcromegaliaSchedaBase.NESSUN_VALORE, null);
		model.addAttribute("tipiTiroide", tipiTiroide);
		model.addAttribute("tipiColonscopia", tipiColonscopia);
		
		/* Recupero la lista degli esami immuno-isto-chimici */
		model.addAttribute("immunoistochimiche", this.malattieService.getImmunoIstochimica());
		
		return "acromegaliaSchedaFollowup";
	}
	// ----------------- REDIRECT -----------------
	
	@RequestMapping("/paziente/acromegaliaSchedaBase/indietro")
	public String visualizzaDettaglioPaziente(Model model, HttpSession session) {
		
		return REDIRECT + PAZIENTE_DETTAGLIO_PATH;
	}

	@Override
	public String getRedirectResourceForSchedaBaseIns() {
		
		return INSERT_PATH;
	}

	@Override
	public String getRedirectResourceForSchedaBaseDettaglioView() {
		
		return VIEW_PATH;
	}

	@Override
	public String getRedirectResourceForSchedaBaseDettaglioEdit() {
		
		return EDIT_PATH;
	}

	@Override
	public String getRedirectResourceForSchedaFollowupIns() {
		
		return INSERT_SFU_PATH;
	}
}
